gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdib/dib_global.cpp
/********************************************************************** // // // ########## ###### ######### # ###### # // ############# ########### ######### ######### ### // ######## # ### ## ############# ## ## ##### # #### // #### ## ## ### ### ### # # ##### ##### // # ### # # ## ## ## ## ### // ## ###### ## ## #### #### # # ## // ######### ### ## ### ####### ###### ## ## ### // ###### ## ###### ## ## #### # ## #### // ####### ## ###### ## ### ## ## ### ###### // ######### ## ###### ## ###### ### ## ### # ##### // ## ###### ####### ### #### ## ## ####### ######## ## #### // ## #### ### # ### ### ## ########## ###### ## #### // ## ## ## ######### #### # ## // # ### // ## // ### // ## // // // RingSDK多媒体类库 ringdib.lib //作者:临风 // //版本:1.0 // //声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到 // 你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在 // 修改的同时给作者一份同样的副本。 // 本类库不得用于任何商业用途,如确实需要,请与作者联系。 // //e-mail:ringphone@sina.com // //原文件名:dib_global.cpp // //说明:全局帮助函数实现 // **********************************************************************/ #define MAKE_SELF_LIB #include "ringdib.h" ///////////////////////////////////////////////// // // 以下函数应用于DIB图象缩放绘制比率为整数倍(但 // 包括缩小1/3倍)的情况,如果图象缩放比率带小数, // 请勿调用(结果数据不准的)。 // // 参数rate说明: // rate为图象缩放倍率,应用于图象缩放绘制的情况 // rate的取值必须遵守以下规则: // // rate >= 0,放大倍数为radio+1, // 即原图象一个像素绘制到屏幕为radio+1个像素 // rate == -1,缩小倍数为1/3, // 即原图象4个像素绘制到屏幕为3个像素,绘制后 // 为原图象的66.7% // rate < -1,缩小倍数为(-radio), // 即原图象(-radio)个像素绘制到屏幕为一个像素 // // 调用时应该设置rate = GetDIBShowRate(dib); // 当然一般应用中要用到此功能都会为图象设置一个rate, // 不用计算rate,而是根据rate计算图象的绘制目的矩形。 // ///////////////////////////////////////////////// //根据在图象上的绝对位置求绘制到屏幕的位置 BOOL Get_OnDCRect(RingDIB* dib,int rate,CONST RECT* lpsrc,LPRECT lpdst) { if(dib == NULL || lpsrc == NULL || lpdst == NULL) return FALSE; RECT src,dst; dib->GetSrcRect(&src); dib->GetDestRect(&dst); //rate >= 0,放大倍数为radio+1 //rate == -1,缩小倍数为3/4 //rate < -1,缩小倍数为(-radio) if(rate >= 0) { rate ++; lpdst->left = (lpsrc->left - src.left) * rate + dst.left; lpdst->top = (lpsrc->top - src.top) * rate + dst.top; lpdst->right = (lpsrc->right - src.left) * rate + dst.left; lpdst->bottom = (lpsrc->bottom - src.top) * rate + dst.top; } else if(rate == -1) { lpdst->left = (lpsrc->left - src.left) * 3/4 + dst.left; lpdst->top = (lpsrc->top - src.top) * 3/4 + dst.top; lpdst->right = (lpsrc->right - src.left) * 3/4 + dst.left; lpdst->bottom = (lpsrc->bottom - src.top) * 3/4 + dst.top; } else { rate = -rate; lpdst->left = (lpsrc->left - src.left) / rate + dst.left; lpdst->top = (lpsrc->top - src.top) / rate + dst.top; lpdst->right = (lpsrc->right - src.left) / rate + dst.left; lpdst->bottom = (lpsrc->bottom - src.top) / rate + dst.top; } return TRUE; } //根据绘制到屏幕的位置求在图象上的绝对位置 BOOL Get_OnDIBRect(RingDIB* dib,int rate,CONST RECT* lpsrc,LPRECT lpdst) { if(dib == NULL || lpsrc == NULL || lpdst == NULL) return FALSE; RECT src,dst; dib->GetSrcRect(&src); dib->GetDestRect(&dst); //rate >= 0,放大倍数为radio+1 //rate == -1,缩小倍数为3/4 //rate < -1,缩小倍数为(-radio) if(rate >= 0) { rate ++; lpdst->left = (lpsrc->left - dst.left) / rate + src.left; lpdst->top = (lpsrc->top - dst.top) / rate + src.top; lpdst->right = (lpsrc->right - dst.left) / rate + src.left; lpdst->bottom = (lpsrc->bottom - dst.top) / rate + src.top; } else if(rate == -1) { lpdst->left = (lpsrc->left - dst.left) * 4/3 + src.left; lpdst->top = (lpsrc->top - dst.top) * 4/3 + src.top; lpdst->right = (lpsrc->right - dst.left) * 4/3 + src.left; lpdst->bottom = (lpsrc->bottom - dst.top) * 4/3 + src.top; } else { rate = -rate; lpdst->left = (lpsrc->left - dst.left) * rate + src.left; lpdst->top = (lpsrc->top - dst.top) * rate + src.top; lpdst->right = (lpsrc->right - dst.left) * rate + src.left; lpdst->bottom = (lpsrc->bottom - dst.top) * rate + src.top; } return TRUE; } int GetDIBShowRate(RingDIB* dib) { if(dib == NULL) return 0; RECT rcd,rcs; int dw,sw; dib->GetDestRect(&rcd); dib->GetSrcRect(&rcs); dw = rcd.right - rcd.left; sw = rcs.right - rcs.left; if(dw >= sw) return (dw / sw) - 1; else if(dw * 4/3 == sw) return -1; else return -(sw / dw); } //根据在图象上的绝对位置求绘制到屏幕的位置 BOOL Get_OnDCPt(RingDIB* dib,int rate,CONST POINT* lpsrc,LPPOINT lpdst) { if(dib == NULL || lpsrc == NULL || lpdst == NULL) return FALSE; RECT src,dst; dib->GetSrcRect(&src); dib->GetDestRect(&dst); //rate >= 0,放大倍数为radio+1 //rate == -1,缩小倍数为3/4 //rate < -1,缩小倍数为(-radio) if(rate >= 0) { rate ++; lpdst->x = (lpsrc->x - src.left) * rate + dst.left; lpdst->y = (lpsrc->y - src.top) * rate + dst.top; } else if(rate == -1) { lpdst->x = (lpsrc->x - src.left) * 3/4 + dst.left; lpdst->y = (lpsrc->y - src.top) * 3/4 + dst.top; } else { rate = -rate; lpdst->x = (lpsrc->x - src.left) / rate + dst.left; lpdst->y = (lpsrc->y - src.top) / rate + dst.top; } return TRUE; } //根据绘制到屏幕的位置求在图象上的绝对位置 BOOL Get_OnDIBPt(RingDIB* dib,int rate,CONST POINT* lpsrc,LPPOINT lpdst) { if(dib == NULL || lpsrc == NULL || lpdst == NULL) return FALSE; RECT src,dst; dib->GetSrcRect(&src); dib->GetDestRect(&dst); //rate >= 0,放大倍数为radio+1 //rate == -1,缩小倍数为3/4 //rate < -1,缩小倍数为(-radio) if(rate >= 0) { rate ++; lpdst->x = (lpsrc->x - dst.left) / rate + src.left; lpdst->y = (lpsrc->y - dst.top) / rate + src.top; } else if(rate == -1) { lpdst->x = (lpsrc->x - dst.left) * 4/3 + src.left; lpdst->y = (lpsrc->y - dst.top) * 4/3 + src.top; } else { rate = -rate; lpdst->x = (lpsrc->x - dst.left) * rate + src.left; lpdst->y = (lpsrc->y - dst.top) * rate + src.top; } return TRUE; }